//package com.wwg.doudian;
//
////package com.guangeryi.mall.core.utils;
//
//import com.alibaba.fastjson.JSONObject;
//import com.sun.javaws.CacheUtil;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.poi.ss.usermodel.DateUtil;
//
//import java.io.UnsupportedEncodingException;
//import java.math.BigInteger;
//import java.net.URLEncoder;
//import java.security.MessageDigest;
//import java.security.NoSuchAlgorithmException;
//import java.util.Date;
//import java.util.Map;
//import java.util.TreeMap;
//
//
//public class DouDianUtils {
//
//    /**
//     * 抖店接口域名
//     */
//    private static final String DOUDIAN_URL = "https://openapi-fxg.jinritemai.com";
//    /*
//        App Key
//    6954268087210427934
//        App Secret
//    3e38351d-9184-43b7-83f7-1542c80c4bb2
//    */
//
//    /**
//     * app key
//     */
//    private static final String APP_KEY = "6954268087210427934";
//    /**
//     * app secret
//     */
//    private static final String APP_SECRET = "3e38351d-9184-43b7-83f7-1542c80c4bb2";
//    /**
//     * 抖店cache的cacheName
//     */
//    private static final String DOUDIAN_CACHE_NAME = "doudianCache";
//    /**
//     * 抖店cache的cacheKey
//     */
//    private static final String DOUDIAN_TOKEN_KEY = "doudian_access_token";
//
//    /**
//     * 通过api取accessToken
//     */
//    public static void fetchAccessToken() {
//        String url = DOUDIAN_URL + "/oauth2/access_token" + "?app_id=" + APP_KEY + "&app_secret="
//                + APP_SECRET + "&grant_type=authorization_self";
//        String response = HttpUtils.httpGet(url, 20000);
//        if (StringUtils.isBlank(response)) {
//            for (int i = 0; i < 3; i++) {
//                response = HttpUtils.httpGet(url, 20000);
//                if (StringUtils.isNotBlank(response)) {
//                    break;
//                }
//                try {
//                    Thread.sleep(1000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//        JSONObject jsonObject = JSONObject.parseObject(response);
//        if (jsonObject.getIntValue("err_no") == 0) {
//            JSONObject data = jsonObject.getJSONObject("data");
//            if (null != data) {
//                //用于调用API的access_token
//                String accessToken = data.getString("access_token");
//                if (StringUtils.isNotBlank(accessToken)) {
//                    CacheUtil.put(DOUDIAN_CACHE_NAME, DOUDIAN_TOKEN_KEY, accessToken);
//                }
//            }
//        }
//    }
//
//    /**
//     * 获取 输入参数签名结果 sign
//     *
//     * @param methodName 方法名
//     * @param paramJson 传参
//     * @param timeStamp 时间戳
//     * @return sign
//     */
//    public static String fetchSign(String methodName, String paramJson, String timeStamp) {
//        String requestStr = APP_SECRET + "app_key" + APP_KEY + "method" + methodName + "param_json" + paramJson + "timestamp"
//                + timeStamp + "v2" + APP_SECRET;
//        return paramToMD5(requestStr);
//    }
//
//    /**
//     * 将param参数转成MD5
//     *
//     * @param requestStr 请求参数
//     * @return String
//     */
//    public static String paramToMD5(String requestStr) {
//        byte[] secretBytes;
//        try {
//            secretBytes = MessageDigest.getInstance("md5").digest(
//                    requestStr.getBytes());
//        } catch (NoSuchAlgorithmException e) {
//            throw new RuntimeException("没有这个md5算法！");
//        }
//        StringBuilder md5code = new StringBuilder(new BigInteger(1, secretBytes).toString(16));
//        while (md5code.length() < 32) {
//            md5code.insert(0, "0");
//        }
//        return md5code.toString();
//    }
//
//    /**
//     * 获取订单列表 支持按照子订单状态和订单的创建时间、更新时间来检索订单，获取订单列表
//     *
//     * Tips：
//     * 此接口做了限流，每个access_token每分钟1000次上限
//     * 此接口，page最多返回100页，一页最多100单，故同样的请求，最多能拉到1万单
//     * 通过该接口获取到的父订单，会在order_id后面会加上字母A做标识（这里和从店铺后台导出的订单有区别，从店铺后台导出的订单末尾没有A，
//     * 但其实际和通过openapi获取的父订单是同一个，如依据运营导出的订单做核对，则请做订单末尾的A相关处理）
//     * 如搜索时指定order_status，则搜索维度为子订单，即按照子订单状态搜索，total也为该状态子订单数量。返回结果的json结构不变，仍为父子订单结构，
//     * 因此当有父订单包含多子订单时，返回的结构中父订单可能会有重复!
//     * 由于订单同步会有延迟，建议在使用open接口拉取订单时，要做缓冲和兜底处理。比如，在今天的6:00去拉取5:30-5:40的数据后（20分钟后拉），明天的6:00时再拉取一次今天5:30-5:40的数据（兜底补拉）
//     *
//     * 拉订单最好不要100页的拉，要98-99页的拉，100页有的时候会出问题
//     * start_time 开始时间
//     * end_time 结束时间
//     * order_by 1、默认按订单创建时间搜索 2、值为“create_time”：按订单创建时间；值为“update_time”：按订单更新时间
//     * @return JSONArray
//     * @throws UnsupportedEncodingException
//     */
//    public static JSONObject fetchOrderList() throws UnsupportedEncodingException {
//        Map<String, String> map = new TreeMap<>();
//        map.put("start_time", "2020/08/01 00:00:00");
//        map.put("end_time", "2020/10/02 00:00:00");
//        map.put("order_by", "create_time");
//        String paramJson = JSONObject.toJSONString(map);
//        String accessToken = (String) CacheUtil.get(DOUDIAN_CACHE_NAME, DOUDIAN_TOKEN_KEY);
//        String url = DOUDIAN_URL + "/order/list";
//        Date now = new Date();
//        String dateStr = DateUtil.date2Str(now, "yyyy-MM-dd HH:mm:ss");
//
//        String sign = fetchSign("order.list", paramJson, dateStr);
//        //转码
//        String paramJson2 = URLEncoder.encode(paramJson, "UTF-8");
//        String dateStr2 = URLEncoder.encode(dateStr, "UTF-8");
//        String param = "?app_key=" + APP_KEY + "&method=" + "order.list" + "&access_token="
//                + accessToken + "&param_json=" + paramJson2 + "&timestamp=" + dateStr2 + "&v=2&sign=" + sign;
//        String response = HttpUtils.httpGet(url + param, 20000);
//        JSONObject jsonObject = JSONObject.parseObject(response);
//        if (jsonObject.getIntValue("err_no") == 0) {
//            return jsonObject.getJSONObject("data");
//        }
//        return null;
//    }
//}